<?php
/**
 * phpfo.com - phpfo.com
 * Created   : 2007-10-10
 * Modified  : 2007-12-22
 * @copyright: 2007 phpfo.com http://www.phpfo.com
 * @version  : 1.2.0
 * @package  : Util
 * @author   : Joseph Chen (phpfo.com@gmail.com)
 * @abstract : IP操作类
 * @example  :
 */
class Ip{

	function __construct(){

	}

	/**
	 * 获取客户端IP
	 *
	 * @return String
	 */
	public static function getIp(){
		if ($_SERVER["REMOTE_ADDR"]) {
			return $_SERVER["REMOTE_ADDR"];
		} elseif (getenv("HTTP_X_FORWARDED_FOR")) {
			return getenv("HTTP_X_FORWARDED_FOR");
		} elseif (getenv("HTTP_CLIENT_IP")) {
			return getenv("HTTP_CLIENT_IP");
		} elseif (getenv("REMOTE_ADDR")){
			return getenv("REMOTE_ADDR");
		} else {
			return '';
		}
	}

	/**
	 * 将标准的IP形式转化成十进制形式IP
	 *
	 * @param String $ip
	 * @return Interger
	 */
	public static function ip2long($ip){
		return self::getIntIp($ip);
	}

	/**
	 * 将十进制形式IP转化成标准的IP形式
	 *
	 * @param Integer $ip
	 * @return String
	 */
	public static function long2ip($ip){
		return long2ip($ip);
	}

	/**
	 * 获取转换成整型的IP地址
	 *
	 * @param String $ip
	 * @return float
	 */
	public static function getIntIp($ip = '') {
		if (PHP_VERSION >= '5') {
			empty($ip) && $ip = self::getIp();
		} else {
			empty($ip) && $ip = Ip::getIp();
		}
		//返回浮点型,不能转换成整型,否则会溢出
		//php支持的最大整形为2147483647
		return (float)sprintf('%u',ip2long($ip));
	}

	/**
	 * 获取2进制形式IP
	 *
	 * @param float $ip
	 * @return string 2进制形式IP
	 */
	public static function getBinIp($ip = '') {
		if (PHP_VERSION >= '5') {
			empty($ip) && $ip = self::getIntIp();
		} else {
			empty($ip) && $ip = Ip::getIntIp();
		}
		return decbin($ip);
	}

	/**
	 * 获取16进制形式IP
	 *
	 * @param float $ip
	 * @return string 16进制形式IP
	 */
	public static function getHexIp($ip = '') {
		if (PHP_VERSION >= '5') {
			empty($ip) && $ip = self::getIntIp();
		} else {
			empty($ip) && $ip = Ip::getIntIp();
		}
		return dechex($ip);
	}

	/**
	 * 获取16进制形式IP
	 *
	 * @param float $ip
	 * @return string 16进制形式IP
	 */
	public static function getStrHexIp($ip = '') {
		if (PHP_VERSION >= '5') {
			empty($ip) && $ip = self::getIp();
		} else {
			empty($ip) && $ip = Ip::getIp();
		}
		$ip_sep =  explode('.', $ip);
		return sprintf('%02x%02x%02x%02x', $ip_sep[0], $ip_sep[1], $ip_sep[2], $ip_sep[3]);
	}
}


